package com.atguigu.rabbitmq.day03;

import com.atguigu.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;

import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;

//本次测试是为了验证消息在手动应答时是不丢失的，会放回到队列中重新消费
public class Task2 {
    //队列名称
    public static  final String task_queue_name="ack_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtils.getChannel();
        //开启发布确认
        channel.confirmSelect();
        //声明队列
        boolean durable =true;//需要让队列持久化
        channel.queueDeclare(task_queue_name,true,false,false,null);

        //从控制台输入信息
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要发送的消息:");

        while (sc.hasNext()){
            String message = sc.next();
            /*强烈建议在转二进制的时候加上UTF-8，英文还好，如果是中文就很可能出现乱码问题*/
            //设置生产者发送消息为持久化消息（意思是要求保存到磁盘上）把第三个参数改成MessageProperties.PERSISTENT_TEXT_PLAIN
            channel.basicPublish("",task_queue_name, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));
            System.out.println("生产者发出消息："+message);

        }
    }
}
/*你想直接把已经存在的队列从不持久化改成持久化（即直接把第二个参数改成false）会报错，报错内容是你的队列当前就是不持久化，不能改成持久化，如果你想
* 让你的队列是持久化的，必须先删除原来的队列，在创建新队列的时候初始值就设为持久化，队列变成持久化后，即使重启rabbitmq，队列也依然存在
*  怎么删除原队列：可以在RabbitMq后台管理那直接删除*/

/*注：设置队列和消息的持久化都是在生产者这改代码*/

/*要想做到数据绝对不丢失，必须要三步：1.设置队列为持久化 2.设置消息为持久化 3.发布确认
* 如果只有前两步，那么有可能在存到磁盘之前宕机了，同样会丢失数据，发布确认就是在存到磁盘上之后告诉发布者已经存到磁盘上了*/


